<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    Function.prototype.before = function( beforefn ){
        var __self = this;
        return function(){
            beforefn.apply( this, arguments ); // (1)
            return __self.apply( this, arguments ); // (2)
        }
    }
    var ajax = function( type, url, param ){
        console.dir(param);
        // 发送 ajax 请求的代码略
    };
    ajax( 'get', 'http:// xxx.com/userinfo', { name: 'sven' } );
//     上面的伪代码表示向后台 cgi 发起一个请求来获取用户信息，传递给 cgi 的参数是{ name:
//         'sven' }。
// ajax 函数在项目中一直运转良好，跟 cgi 的合作也很愉快。直到有一天，我们的网站遭受了
//     CSRF 攻击。解决 CSRF 攻击最简单的一个办法就是在 HTTP 请求中带上一个 Token 参数。
// 假设我们已经有一个用于生成 Token 的函数：
    var getToken = function(){
        return 'Token';
    }
    // 现在的任务是给每个 ajax 请求都加上 Token 参数：
var ajax = function( type, url, param ){
    param = param || {};
    Param.Token = getToken(); // 发送 ajax 请求的代码略...
};
    /*虽然已经解决了问题，但我们的 ajax 函数相对变得僵硬了，每个从 ajax 函数里发出的请求
    都自动带上了 Token 参数，虽然在现在的项目中没有什么问题，但如果将来把这个函数移植到其
    他项目上，或者把它放到一个开源库中供其他人使用，Token 参数都将是多余的。
也许另一个项目不需要验证 Token，或者是 Token 的生成方式不同，无论是哪种情况，都必
    须重新修改 ajax 函数。
为了解决这个问题，先把 ajax 函数还原成一个干净的函数：*/
var ajax= function( type, url, param ){
    console.log(param); // 发送 ajax 请求的代码略
};
    // 然后把 Token 参数通过 Function.prototyte.before 装饰到 ajax 函数的参数 param 对象中：
var getToken = function(){
    return 'Token';
}
    ajax = ajax.before(function( type, url, param ){
        param.Token = getToken();
    });
    ajax( 'get', 'http:// xxx.com/userinfo', { name: 'sven' } );
//     从 ajax 函数打印的 log 可以看到，Token 参数已经被附加到了 ajax 请求的参数中：
// {name: "sven", Token: "Token"}

</script>

</body>
</html>